﻿#include <QScrollBar>
#include <QHeaderView>
#include <QDebug>

#include "frozencolumntablewidget.h"

FrozenColumnTableWidget::FrozenColumnTableWidget() {}

FrozenColumnTableWidget::FrozenColumnTableWidget(QAbstractItemModel *model)
{
    setModel(model);
    frozenTableView = new QTableView(this);  //frozenTableView 私有变量，类型为：QTableView

    init();

    connect(horizontalHeader(),SIGNAL(sectionResized(int,int,int)),this,
            SLOT(updateSectionWidth(int,int,int)));
    connect(verticalHeader(),SIGNAL(sectionResized(int,int,int)),this,
            SLOT(updateSectionHeight(int,int,int)));

    connect(frozenTableView->verticalScrollBar(),SIGNAL(valueChanged(int)),
            verticalScrollBar(),SLOT(setValue(int)));
    connect(verticalScrollBar(),SIGNAL(valueChanged(int)),
            frozenTableView->verticalScrollBar(),SLOT(setValue(int)));

}


FrozenColumnTableWidget::~FrozenColumnTableWidget()
{
    delete frozenTableView;
}


void FrozenColumnTableWidget::init()
{
    frozenTableView->setModel(model());// private member
    //自己本来不就是个 QTableView 吗，为什么还要借助于成员变量，看帮助文档上，貌似要在本身的QTableView 上再覆盖一层QTableView ，(⊙_⊙)，值得思考

    frozenTableView->setFocusPolicy(Qt::NoFocus);
    frozenTableView->verticalHeader()->hide();
    frozenTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);

    viewport()->stackUnder(frozenTableView);

    frozenTableView->setStyleSheet("QTableView { border: none;"
                                   "background-color:#8EDE21;"
                                   "selection-background-color: #999 }");
    frozenTableView->setSelectionModel(this->selectionModel());
    for (int col = 2; col < model()->columnCount(); ++col) {
        frozenTableView->setColumnHidden(col,true);//设置隐藏，从 1 行开头之后的所有行
    }

    frozenTableView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    frozenTableView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    frozenTableView->show();

    updateFrozenTableGeometry();

    setHorizontalScrollMode(ScrollPerPixel);
    setVerticalScrollMode(ScrollPerPixel);
    frozenTableView->setVerticalScrollMode(ScrollPerPixel);

}

void FrozenColumnTableWidget::updateSectionWidth(int logicalIndex, int oldSize, int newSize)
{
    if (logicalIndex == 0) {
        frozenTableView->setColumnWidth(0,newSize);
        updateFrozenTableGeometry();
    }
}

void FrozenColumnTableWidget::updateSectionHeight(int logicalIndex, int /*oldSize*/, int newSize)
{
    frozenTableView->setRowHeight(logicalIndex,newSize);
}


void FrozenColumnTableWidget::resizeEvent(QResizeEvent *event)
{
    QTableView::resizeEvent(event); //调用父类的resizeEvent
    updateFrozenTableGeometry();
}

QModelIndex FrozenColumnTableWidget::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
{
    QModelIndex current = QTableView::moveCursor(cursorAction,modifiers);

    if (cursorAction == MoveLeft
            && current.column() > 0
            && visualRect(current).topLeft().x() < frozenTableView->columnWidth(0) )
    {
        const int newValue = horizontalScrollBar()->value() + visualRect(current).topLeft().x()
                - frozenTableView->columnWidth(0);
        horizontalScrollBar()->setValue(newValue);;
    }

    return current;
}

void FrozenColumnTableWidget::scrollTo(const QModelIndex &index, ScrollHint hint){
	 if (index.column() > 0)
	    QTableView::scrollTo(index,hint);
}

void FrozenColumnTableWidget::updateFrozenTableGeometry()////调整内嵌 frozenTableView 的大小
{
    frozenTableView->setGeometry(verticalHeader()->width(),
                                 frameWidth(),
                                 columnWidth(0)+ columnWidth(0),
                                 viewport()->height() + horizontalHeader()->height() *2 );//更细一下位置，为什么更新
}
